home *** CD-ROM | disk | FTP | other *** search
/ Freelog 115 / FreelogNo115-MaiJuin2013.iso / Internet / Filezilla Server / FileZilla_Server-0_9_41.exe / source / interface / UsersDlg.cpp < prev    next >
C/C++ Source or Header  |  2011-11-06  |  13KB  |  560 lines

  1. // FileZilla Server - a Windows ftp server
  2.  
  3. // Copyright (C) 2002-2004 - Tim Kosse <tim.kosse@gmx.de>
  4.  
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the GNU General Public License
  7. // as published by the Free Software Foundation; either version 2
  8. // of the License, or (at your option) any later version.
  9.  
  10. // This program is distributed in the hope that it will be useful,
  11. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. // GNU General Public License for more details.
  14.  
  15. // You should have received a copy of the GNU General Public License
  16. // along with this program; if not, write to the Free Software
  17. // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18.  
  19. // UsersDlg.cpp: Implementierungsdatei
  20. //
  21.  
  22. #include "stdafx.h"
  23. #include "FileZilla server.h"
  24. #include "UsersDlg.h"
  25. #include "misc\sbdestination.h"
  26. #include "entersomething.h"
  27. #include "NewUserDlg.h"
  28. #include "UsersDlgGeneral.h"
  29. #include "UsersDlgSpeedLimit.h"
  30. #include "UsersDlgSharedFolders.h"
  31. #include "UsersDlgIpFilter.h"
  32.  
  33. #if defined(_DEBUG) && !defined(MMGR)
  34. #define new DEBUG_NEW
  35. #undef THIS_FILE
  36. static char THIS_FILE[] = __FILE__;
  37. #endif
  38.  
  39. /////////////////////////////////////////////////////////////////////////////
  40. // Dialogfeld CUsersDlg 
  41.  
  42. CUsersDlg::CUsersDlg(CWnd* pParent, bool localConnection)
  43.     : CSAPrefsDialog(IDD, pParent)
  44. {
  45.     m_insideSelchange = false;
  46.     m_localConnection = localConnection;
  47.  
  48.     m_pGeneralPage = new CUsersDlgGeneral(this);
  49.     m_pSpeedLimitPage = new CUsersDlgSpeedLimit(this);
  50.     m_pSharedFoldersPage = new CUsersDlgSharedFolders(this);
  51.     m_pIpFilterPage = new CUsersDlgIpFilter(this);
  52.  
  53.     AddPage(*m_pGeneralPage, _T("General"));
  54.     AddPage(*m_pSharedFoldersPage, _T("Shared folders"));
  55.     AddPage(*m_pSpeedLimitPage, _T("Speed Limits"));
  56.     AddPage(*m_pIpFilterPage, _T("IP Filter"));
  57. }
  58.  
  59. CUsersDlg::~CUsersDlg()
  60. {
  61.     delete m_pGeneralPage;
  62.     delete m_pSpeedLimitPage;
  63.     delete m_pSharedFoldersPage;
  64.     delete m_pIpFilterPage;
  65. }
  66.  
  67.  
  68. void CUsersDlg::DoDataExchange(CDataExchange* pDX)
  69. {
  70.     CSAPrefsDialog::DoDataExchange(pDX);
  71.     //{{AFX_DATA_MAP(CUsersDlg)
  72.     DDX_Control(pDX, IDC_USERLIST, m_cUserlist);
  73.     //}}AFX_DATA_MAP
  74. }
  75.  
  76.  
  77. BEGIN_MESSAGE_MAP(CUsersDlg, CSAPrefsDialog)
  78.     //{{AFX_MSG_MAP(CUsersDlg)
  79.     ON_LBN_SELCHANGE(IDC_USERLIST, OnSelchangeUserlist)
  80.     ON_WM_CONTEXTMENU()
  81.     ON_COMMAND(ID_USERMENU_ADD, OnUsermenuAdd)
  82.     ON_COMMAND(ID_USERMENU_COPY, OnUsermenuCopy)
  83.     ON_COMMAND(ID_USERMENU_REMOVE, OnUsermenuRemove)
  84.     ON_COMMAND(ID_USERMENU_RENAME, OnUsermenuRename)
  85.     ON_BN_CLICKED(IDC_USERADD, OnUseradd)
  86.     ON_BN_CLICKED(IDC_USERCOPY, OnUsercopy)
  87.     ON_BN_CLICKED(IDC_USERREMOVE, OnUserremove)
  88.     ON_BN_CLICKED(IDC_USERRENAME, OnUserrename)
  89.     //}}AFX_MSG_MAP
  90. END_MESSAGE_MAP()
  91.  
  92. /////////////////////////////////////////////////////////////////////////////
  93. // Behandlungsroutinen fⁿr Nachrichten CUsersDlg 
  94.  
  95. BOOL CUsersDlg::OnInitDialog() 
  96. {
  97.     CSAPrefsDialog::OnInitDialog();
  98.  
  99.     m_olduser = LB_ERR;
  100.     
  101.     m_cUserlist.ResetContent();    
  102.  
  103.     for (unsigned int i=0;i<m_UsersList.size();i++)
  104.     {
  105.         int index=m_cUserlist.AddString(m_UsersList[i].user);
  106.         m_cUserlist.SetItemData(index, i);
  107.     }
  108.  
  109.     if (m_UsersList.size())
  110.     {
  111.         m_cUserlist.SetCurSel(0);
  112.         OnSelchangeUserlist();
  113.     }
  114.     
  115.     SetCtrlState();
  116.  
  117.     return TRUE;  // return TRUE unless you set the focus to a control
  118.                   // EXCEPTION: OCX-Eigenschaftenseiten sollten FALSE zurⁿckgeben
  119. }
  120.  
  121. BOOL CUsersDlg::Validate()
  122. {
  123.     CString res = m_pGeneralPage->Validate();
  124.     if (res != _T(""))
  125.     {
  126.         ShowPage(m_pGeneralPage);
  127.         m_cUserlist.SetCurSel(m_olduser);
  128.         MessageBox(res);
  129.         return FALSE;
  130.     }
  131.     res = m_pSpeedLimitPage->Validate();
  132.     if (res != _T(""))
  133.     {
  134.         ShowPage(m_pSpeedLimitPage);
  135.         m_cUserlist.SetCurSel(m_olduser);
  136.         MessageBox(res);
  137.         return FALSE;
  138.     }
  139.     res = m_pSharedFoldersPage->Validate();
  140.     if (res != _T(""))
  141.     {
  142.         ShowPage(m_pSharedFoldersPage);
  143.         m_cUserlist.SetCurSel(m_olduser);
  144.         MessageBox(res);
  145.         return FALSE;
  146.     }
  147.     res = m_pIpFilterPage->Validate();
  148.     if (res != _T(""))
  149.     {
  150.         ShowPage(m_pIpFilterPage);
  151.         m_cUserlist.SetCurSel(m_olduser);
  152.         MessageBox(res);
  153.         return FALSE;
  154.     }
  155.     return TRUE;
  156. }
  157.  
  158. void CUsersDlg::OnSelchangeUserlist() 
  159. {
  160.     m_insideSelchange = true;
  161.     if (!Validate())
  162.     {
  163.         m_insideSelchange = false;
  164.         return;
  165.     }
  166.     m_insideSelchange = false;
  167.  
  168.     if (m_olduser!=LB_ERR)
  169.     {
  170.         int oldindex = m_cUserlist.GetItemData(m_olduser);
  171.         VERIFY(m_pGeneralPage->SaveUser(&m_UsersList[oldindex]));
  172.         VERIFY(m_pSpeedLimitPage->SaveUser(&m_UsersList[oldindex]));
  173.         VERIFY(m_pSharedFoldersPage->SaveUser(&m_UsersList[oldindex]));
  174.         VERIFY(m_pIpFilterPage->SaveUser(&m_UsersList[oldindex]));
  175.     }
  176.     int nItem = m_cUserlist.GetCurSel();
  177.     if (nItem!=LB_ERR)
  178.     {
  179.         m_olduser = nItem;
  180.         int index = m_cUserlist.GetItemData(nItem);
  181.         VERIFY(m_pGeneralPage->DisplayUser(&m_UsersList[index]));
  182.         VERIFY(m_pSpeedLimitPage->DisplayUser(&m_UsersList[index]));
  183.         VERIFY(m_pSharedFoldersPage->DisplayUser(&m_UsersList[index]));
  184.         VERIFY(m_pIpFilterPage->DisplayUser(&m_UsersList[index]));
  185.     }
  186.     else
  187.     {
  188.         VERIFY(m_pGeneralPage->DisplayUser(NULL));
  189.         VERIFY(m_pSpeedLimitPage->DisplayUser(NULL));
  190.         VERIFY(m_pSharedFoldersPage->DisplayUser(0));
  191.         VERIFY(m_pIpFilterPage->DisplayUser(0));
  192.     }
  193.     m_pGeneralPage->UpdateData(FALSE);
  194.  
  195.     SetCtrlState();
  196. }
  197.  
  198. void CUsersDlg::OnOK() 
  199. {
  200.     if (!Validate())
  201.         return;
  202.     m_cUserlist.SetCurSel(-1);
  203.     OnSelchangeUserlist();
  204.     
  205.     CSAPrefsDialog::OnOK();
  206. }
  207.  
  208. void CUsersDlg::OnContextMenu(CWnd* pWnd, CPoint point) 
  209. {
  210.     if (pWnd == &m_cUserlist)
  211.     {
  212.         CMenu menu;
  213.         menu.LoadMenu(IDR_USERCONTEXT);
  214.  
  215.         CMenu* pPopup = menu.GetSubMenu(0);
  216.         ASSERT(pPopup != NULL);
  217.         CWnd* pWndPopupOwner = this;
  218.         while (pWndPopupOwner->GetStyle() & WS_CHILD)
  219.             pWndPopupOwner = pWndPopupOwner->GetParent();
  220.         
  221.         if (m_cUserlist.GetCurSel() == LB_ERR)
  222.         {
  223.             pPopup->EnableMenuItem(ID_USERMENU_COPY, MF_GRAYED);
  224.             pPopup->EnableMenuItem(ID_USERMENU_REMOVE, MF_GRAYED);
  225.             pPopup->EnableMenuItem(ID_USERMENU_RENAME, MF_GRAYED);
  226.         }
  227.         if (point.x == -1)
  228.             GetCursorPos(&point);
  229.         pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
  230.             pWndPopupOwner);
  231.     }
  232. }
  233.  
  234. void CUsersDlg::OnUsermenuAdd() 
  235. {
  236.     if (!Validate())
  237.         return;
  238.  
  239.     CNewUserDlg dlg;
  240.     for (t_GroupsList::iterator iter=m_GroupsList.begin(); iter!=m_GroupsList.end(); iter++)
  241.         dlg.m_GroupList.push_back(iter->group);
  242.     if (dlg.DoModal()==IDOK)
  243.     {
  244.         CString newname = dlg.m_Name;
  245.         newname.MakeLower();
  246.         for (int i=0; i<m_cUserlist.GetCount(); i++)
  247.         {
  248.             CString str;
  249.             m_cUserlist.GetText(i,str);
  250.             str.MakeLower();
  251.             if (str==newname)
  252.             {
  253.                 AfxMessageBox(IDS_ERRORMSG_USERALREADYEXISTS);
  254.                 return;
  255.             }
  256.         }
  257.  
  258.         t_user user;
  259.         user.user = dlg.m_Name;
  260.         if (dlg.m_Group != _T(""))
  261.         {
  262.             user.group = dlg.m_Group;
  263.             user.nBypassUserLimit = 2;
  264.             user.nBypassServerSpeedLimit[download] = 2;
  265.             user.nBypassServerSpeedLimit[upload] = 2;
  266.             user.nEnabled = 2;
  267.             user.forceSsl = 2;
  268.         }
  269.         else
  270.         {
  271.             user.nBypassUserLimit = 0;
  272.             user.nBypassServerSpeedLimit[download] = 0;
  273.             user.nBypassServerSpeedLimit[upload] = 0;
  274.             user.forceSsl = 0;
  275.         }
  276.         user.nIpLimit = 0;
  277.         user.nUserLimit = 0;
  278.         user.password = _T("");
  279.         int nItem = m_cUserlist.AddString(user.user);
  280.         if (nItem <= m_olduser)
  281.             m_olduser++;
  282.         m_UsersList.push_back(user);
  283.         m_cUserlist.SetItemData(nItem, m_UsersList.size()-1);
  284.         m_cUserlist.SetCurSel(nItem);    
  285.         OnSelchangeUserlist();
  286.     }
  287. }
  288.  
  289. void CUsersDlg::OnUsermenuCopy() 
  290. {
  291.     if (!Validate())
  292.         return;
  293.  
  294.     int pos=m_cUserlist.GetCurSel();
  295.     if (pos==LB_ERR)
  296.         return;
  297.     int index=m_cUserlist.GetItemData(pos);
  298.  
  299.     CEnterSomething dlg(IDS_COPYUSERDIALOG);
  300.     if (dlg.DoModal()==IDOK)
  301.     {
  302.         int i;
  303.         CString newname=dlg.m_String;
  304.         newname.MakeLower();
  305.         for (i=0;i<m_cUserlist.GetCount();i++)
  306.         {
  307.             CString str;
  308.             m_cUserlist.GetText(i,str);
  309.             str.MakeLower();
  310.             if (str==newname)
  311.             {
  312.                 AfxMessageBox(IDS_ERRORMSG_USERALREADYEXISTS);
  313.                 return;
  314.             }
  315.         }
  316.         
  317.         t_user user;
  318.         user.user=dlg.m_String;
  319.         user.nBypassUserLimit = m_UsersList[index].nBypassUserLimit;
  320.         user.nIpLimit = m_UsersList[index].nIpLimit;
  321.         user.nUserLimit = m_UsersList[index].nUserLimit;
  322.         user.password = m_UsersList[index].password;
  323.         for (std::vector<t_directory>::const_iterator iter=m_UsersList[index].permissions.begin(); iter!=m_UsersList[index].permissions.end(); iter++)
  324.             user.permissions.push_back(*iter);
  325.         
  326.         int nItem=m_cUserlist.AddString(user.user);
  327.         if (nItem<=m_olduser)
  328.             m_olduser++;
  329.         m_UsersList.push_back(user);
  330.         m_cUserlist.SetItemData(nItem, m_UsersList.size()-1);
  331.         m_cUserlist.SetCurSel(nItem);    
  332.  
  333.         OnSelchangeUserlist();
  334.     }    
  335. }
  336.  
  337.  
  338. void CUsersDlg::OnUsermenuRemove() 
  339. {
  340.     int pos=m_cUserlist.GetCurSel();
  341.     if (pos==LB_ERR)
  342.         return;
  343.     int index=m_cUserlist.GetItemData(pos);
  344.     m_olduser=LB_ERR;
  345.     int i=0;
  346.     for (t_UsersList::iterator iter=m_UsersList.begin(); iter!=m_UsersList.end(); iter++, i++)
  347.         if (i==index)
  348.         {
  349.             m_UsersList.erase(iter);
  350.             break;
  351.         }
  352.     for (i=0;i<m_cUserlist.GetCount();i++)
  353.     {
  354.         int data=m_cUserlist.GetItemData(i);
  355.         if (data>index)
  356.             m_cUserlist.SetItemData(i, data-1);
  357.     }
  358.     m_cUserlist.DeleteString(pos);
  359.     OnSelchangeUserlist();
  360. }
  361.  
  362. void CUsersDlg::OnUsermenuRename() 
  363. {
  364.     if (!Validate())
  365.         return;
  366.  
  367.     int pos = m_cUserlist.GetCurSel();
  368.     if (pos == LB_ERR)
  369.         return;
  370.     int index=m_cUserlist.GetItemData(pos);
  371.  
  372.     CEnterSomething dlg(IDS_INPUTDIALOGTEXT_RENAME);
  373.     if (dlg.DoModal()==IDOK)
  374.     {
  375.         CString newname=dlg.m_String;
  376.         newname.MakeLower();
  377.         for (int i=0; i < m_cUserlist.GetCount(); i++)
  378.         {
  379.             if (i == pos)
  380.                 continue;
  381.             CString str;
  382.             m_cUserlist.GetText(i,str);
  383.             str.MakeLower();
  384.             if (str == newname)
  385.             {
  386.                 AfxMessageBox(IDS_ERRORMSG_USERALREADYEXISTS);
  387.                 return;
  388.             }
  389.         }
  390.         
  391.         m_cUserlist.DeleteString(pos);
  392.         pos = m_cUserlist.AddString(dlg.m_String);
  393.         m_cUserlist.SetItemData(pos, index);
  394.         m_cUserlist.SetCurSel(pos);    
  395.         m_olduser = pos;
  396.         m_UsersList[index].user = dlg.m_String;
  397.         OnSelchangeUserlist();
  398.     }
  399. }
  400.  
  401. void CUsersDlg::SetCtrlState()
  402. {
  403.     if (m_cUserlist.GetCurSel()==LB_ERR)
  404.     {
  405.         GetDlgItem(IDC_USERREMOVE)->EnableWindow(FALSE);
  406.         GetDlgItem(IDC_USERRENAME)->EnableWindow(FALSE);
  407.         GetDlgItem(IDC_USERCOPY)->EnableWindow(FALSE);
  408.     }
  409.     else
  410.     {
  411.         GetDlgItem(IDC_USERREMOVE)->EnableWindow(TRUE);
  412.         GetDlgItem(IDC_USERRENAME)->EnableWindow(TRUE);
  413.         GetDlgItem(IDC_USERCOPY)->EnableWindow(TRUE);    
  414.     }
  415.     m_pGeneralPage->SetCtrlState();
  416.     m_pSpeedLimitPage->SetCtrlState();
  417.     m_pSharedFoldersPage->SetCtrlState();
  418.     m_pIpFilterPage->SetCtrlState();
  419. }
  420.  
  421. void CUsersDlg::OnUseradd() 
  422. {
  423.     OnUsermenuAdd();
  424. }
  425.  
  426. void CUsersDlg::OnUsercopy() 
  427. {
  428.     OnUsermenuCopy();
  429. }
  430.  
  431. void CUsersDlg::OnUserremove() 
  432. {
  433.     OnUsermenuRemove();
  434. }
  435.  
  436. void CUsersDlg::OnUserrename() 
  437. {
  438.     OnUsermenuRename();
  439. }
  440.  
  441. BOOL CUsersDlg::GetAsCommand(char **pBuffer, DWORD *nBufferLength)
  442. {
  443.     if (!pBuffer)
  444.         return FALSE;
  445.  
  446.     DWORD len = 4;
  447.  
  448.     t_GroupsList::iterator groupiter;
  449.     for (groupiter=m_GroupsList.begin(); groupiter!=m_GroupsList.end(); groupiter++)
  450.         len += groupiter->GetRequiredBufferLen();
  451.  
  452.     t_UsersList::iterator iter;
  453.     for (iter=m_UsersList.begin(); iter!=m_UsersList.end(); iter++)
  454.         len += iter->GetRequiredBufferLen();
  455.  
  456.     *pBuffer=new char[len];
  457.     char *p=*pBuffer;
  458.  
  459.     *p++ = m_GroupsList.size()/256;
  460.     *p++ = m_GroupsList.size()%256;
  461.     for (groupiter=m_GroupsList.begin(); groupiter!=m_GroupsList.end(); groupiter++)
  462.     {
  463.         p = groupiter->FillBuffer(p);
  464.         if (!p)
  465.         {
  466.             delete [] *pBuffer;
  467.             *pBuffer = NULL;
  468.             return FALSE;
  469.         }        
  470.     }
  471.  
  472.     *p++ = m_UsersList.size()/256;
  473.     *p++ = m_UsersList.size()%256;
  474.     for (iter=m_UsersList.begin(); iter!=m_UsersList.end(); iter++)
  475.     {
  476.         p = iter->FillBuffer(p);
  477.         if (!p)
  478.         {
  479.             delete [] *pBuffer;
  480.             *pBuffer = NULL;
  481.             return FALSE;
  482.         }
  483.     }
  484.  
  485.     *nBufferLength = len;
  486.  
  487.     return TRUE;
  488. }
  489.  
  490. BOOL CUsersDlg::Init(unsigned char *pData, DWORD dwDataLength)
  491. {
  492.     unsigned char *p=pData;
  493.     unsigned int i;
  494.  
  495.     if (dwDataLength < 2)
  496.         return FALSE;
  497.     unsigned int num = *p * 256 + p[1];
  498.     p+=2;
  499.     for (i=0; i<num; i++)
  500.     {
  501.         t_group group;
  502.         
  503.         p = group.ParseBuffer(p, dwDataLength-(p-pData));
  504.         if (!p)
  505.             return FALSE;
  506.         m_GroupsList.push_back(group);
  507.     }
  508.  
  509.     if ((UINT)(p-pData+2)>dwDataLength)
  510.         return FALSE;
  511.     num = *p * 256 + p[1];
  512.     p+=2;
  513.     for (i=0; i<num; i++)
  514.     {
  515.         t_user user;
  516.         
  517.         p = user.ParseBuffer(p, dwDataLength-(p-pData));
  518.         if (!p)
  519.             return FALSE;
  520.         m_UsersList.push_back(user);
  521.     }
  522.     return TRUE;
  523. }
  524.  
  525. BOOL CUsersDlg::PreTranslateMessage(MSG* pMsg) 
  526. {
  527.     if (pMsg->message==WM_KEYDOWN)
  528.     {
  529.         if (pMsg->wParam==VK_F2)
  530.         {
  531.             if (GetFocus() == &m_cUserlist)
  532.             {
  533.                 if (m_cUserlist.GetCurSel() == LB_ERR)
  534.                     return TRUE;
  535.                 OnUsermenuRename();
  536.             }
  537.             return TRUE;
  538.         }
  539.     }
  540.     return CSAPrefsDialog::PreTranslateMessage(pMsg);
  541. }
  542.  
  543. t_user* CUsersDlg::GetCurrentUser()
  544. {
  545.     if (m_cUserlist.GetCurSel() == LB_ERR)
  546.         return NULL;
  547.     else
  548.     {
  549.         if (m_insideSelchange)
  550.         {
  551.             if (m_olduser == LB_ERR)
  552.                 return NULL;
  553.             else
  554.                 return &m_UsersList[m_cUserlist.GetItemData(m_olduser)];
  555.         }
  556.         return &m_UsersList[m_cUserlist.GetItemData(m_cUserlist.GetCurSel())];
  557.     }
  558. }
  559.  
  560.